import sys
import os
sys.path.insert(0, os.path.abspath('../'))
sys.path.insert(0, os.path.abspath('../../'))
import qiskit
provider = qiskit.IBMQ.load_account()
import optuna
from qiskit import Aer
from qiskit.utils import QuantumInstance
from qiskit_optimization.algorithms import MinimumEigenOptimizer
from qiskit.algorithms import QAOA
from shared.QiskitMaxcut import *
from ibm.ibm_parameters import *
%matplotlib inline
print_parameters()
Optimizers: ['SPSA', 'QN-SPSA', 'COBYLA'] with MaxIter of 5 Number of shots: 8000 Repetitions: [ 1; 5 ] Gamma value interval: [ -3.141592653589793; 3.141592653589793 ] Beta value interval: [ 3.141592653589793;-3.141592653589793 ] Number of Optuna Trials: 5 Noise Backend Name: ibmq_toronto
# ---- Define graph and MaxCut ----
graph = load_graph()
max_cut = Maxcut(graph)
max_cut_qubo = max_cut.to_qubo()
max_cut.draw()
def init_qaoa(optimizer, reps, init_parameters):
quantum_instance = QuantumInstance(
backend=Aer.get_backend(DEFAULT_QASM_SIMULATOR),
shots=SHOTS)
if optimizer == "QN-SPSA":
# generate QAOA to get ansatz
pre_qaoa = QAOA(optimizer=COBYLA(maxiter=1, tol=0), quantum_instance=quantum_instance, reps=reps, initial_point=init_parameters)
MinimumEigenOptimizer(pre_qaoa).solve(max_cut_qubo)
fidelity = QNSPSA.get_fidelity(pre_qaoa.ansatz)
optimizer = QNSPSA(fidelity, maxiter=MAX_ITER)
qaoa = QAOA(optimizer=optimizer, quantum_instance=quantum_instance, reps=reps,
initial_point=init_parameters)
return qaoa
def run(max_cut_problem, qaoa):
# Run quantum algorithm QAOA
algorithm = MinimumEigenOptimizer(qaoa)
result = algorithm.solve(max_cut_problem)
optimal_parameters = qaoa.optimal_params
return result, optimal_parameters.copy()
def objective(trial):
optimizer_name = trial.suggest_categorical("optimizer", optimizers.keys())
reps = trial.suggest_int('reps', REPS_MIN, REPS_MAX + 1)
parameters = []
for i in range(reps):
parameters.append(trial.suggest_uniform(f'gamma_{i}', GAMMA_MIN, GAMMA_MAX))
for i in range(reps):
parameters.append(trial.suggest_uniform(f'beta_{i}', BETA_MIN, BETA_MAX))
optimizer = optimizers[optimizer_name]
qaoa = init_qaoa(optimizer, reps, parameters)
result, optimal_parameters = run(max_cut_qubo, qaoa)
mean, distribution = max_cut.analyse(result)
trial.set_user_attr(key="best", value=[mean,result,optimal_parameters, optimizer_name])
return mean
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=N_TRIALS, callbacks=[save_best_trial])
[I 2021-08-09 11:02:28,229] A new study created in memory with name: no-name-3b79f961-dd5d-49ae-8ea6-e7fc3cafdadd [I 2021-08-09 11:11:46,957] Trial 0 finished with value: -89.03012500000006 and parameters: {'optimizer': 'SPSA', 'reps': 3, 'gamma_0': 2.584147347777942, 'gamma_1': 1.319981184957716, 'gamma_2': -3.068531423369412, 'beta_0': -0.4325661393658322, 'beta_1': 1.0725387804213202, 'beta_2': 1.3938599673771934}. Best is trial 0 with value: -89.03012500000006. [I 2021-08-09 11:15:01,636] Trial 1 finished with value: -107.741875000001 and parameters: {'optimizer': 'COBYLA', 'reps': 5, 'gamma_0': 1.1089916490011626, 'gamma_1': -2.399247094072507, 'gamma_2': 1.542960814893596, 'gamma_3': 1.816337256510426, 'gamma_4': 1.7334729445954578, 'beta_0': -0.09860513757688594, 'beta_1': 2.8933892854463226, 'beta_2': -2.818569414162452, 'beta_3': -2.5855169985365163, 'beta_4': 2.9036936884175475}. Best is trial 1 with value: -107.741875000001. [I 2021-08-09 11:38:13,344] Trial 2 finished with value: -88.46387500000091 and parameters: {'optimizer': 'SPSA', 'reps': 3, 'gamma_0': -2.6321769786537663, 'gamma_1': 2.4600168536764926, 'gamma_2': -3.1231295772509116, 'beta_0': -2.109104694497521, 'beta_1': -2.1702775954290474, 'beta_2': -2.4604308990364405}. Best is trial 1 with value: -107.741875000001. [I 2021-08-09 11:41:17,155] Trial 3 finished with value: -88.93325000000038 and parameters: {'optimizer': 'COBYLA', 'reps': 5, 'gamma_0': -1.1505034478035345, 'gamma_1': -0.6447437790357498, 'gamma_2': 2.37299050662162, 'gamma_3': -1.3223132939212707, 'gamma_4': -0.6384397745159847, 'beta_0': -0.5404551178094215, 'beta_1': 0.45848578753153957, 'beta_2': -2.817343379982732, 'beta_3': -1.4347899838423106, 'beta_4': -0.4327505083552503}. Best is trial 1 with value: -107.741875000001. [I 2021-08-09 11:43:41,030] Trial 4 finished with value: -89.29337500000003 and parameters: {'optimizer': 'COBYLA', 'reps': 3, 'gamma_0': 1.951103769217167, 'gamma_1': -0.9220581434343176, 'gamma_2': -2.435522599274056, 'beta_0': -0.44844005258201625, 'beta_1': 2.888847070172261, 'beta_2': 1.5459075318919924}. Best is trial 1 with value: -107.741875000001.
print(study.best_trial)
FrozenTrial(number=1, values=[-107.741875000001], datetime_start=datetime.datetime(2021, 8, 9, 11, 11, 50, 715251), datetime_complete=datetime.datetime(2021, 8, 9, 11, 14, 58, 161362), params={'optimizer': 'COBYLA', 'reps': 5, 'gamma_0': 1.1089916490011626, 'gamma_1': -2.399247094072507, 'gamma_2': 1.542960814893596, 'gamma_3': 1.816337256510426, 'gamma_4': 1.7334729445954578, 'beta_0': -0.09860513757688594, 'beta_1': 2.8933892854463226, 'beta_2': -2.818569414162452, 'beta_3': -2.5855169985365163, 'beta_4': 2.9036936884175475}, distributions={'optimizer': CategoricalDistribution(choices=('SPSA', 'QN-SPSA', 'COBYLA')), 'reps': IntUniformDistribution(high=6, low=1, step=1), 'gamma_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_3': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_4': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_3': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_4': UniformDistribution(high=3.141592653589793, low=-3.141592653589793)}, user_attrs={'best': [-107.741875000001, optimal function value: -177.0
optimal value: [0. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0.]
status: SUCCESS, array([ 2.10899165, -1.39924709, 1.54296081, 1.81633726, 1.73347294,
-0.09860514, 2.89338929, -2.81856941, -2.585517 , 2.90369369]), 'COBYLA']}, system_attrs={}, intermediate_values={}, trial_id=1, state=TrialState.COMPLETE, value=None)
fig = optuna.visualization.plot_optimization_history(study)
fig.show()
mean, result, optimal_params, optimizer_name = study.user_attrs["best"]
print(f"Optimizer: {optimizer_name}")
print(f"Optimal Parameters: {optimal_params}")
Optimizer: COBYLA Optimal Parameters: [ 2.10899165 -1.39924709 1.54296081 1.81633726 1.73347294 -0.09860514 2.89338929 -2.81856941 -2.585517 2.90369369]
max_cut.draw(result)
mean, distribution = max_cut.analyse(result, print_output=True)
max_cut.plot_histogram(distribution, mean)
optimal function value: -177.0 optimal value: [0. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0.] status: SUCCESS Number of samples (5616) is too large to display. Skip. Expectation Value: -107.741875000001 Highest Exp.Value: -29 with 0.000125 % Lowest Exp.Value: -177 with 0.002625 % Highest Probability: -98 with 0.02575 % Ratio r: 0.5320396959459527 MSE: 1395.807308515637 RMSE: 37.36050466088001
import qiskit.tools.jupyter
%qiskit_version_table
/home/hm-tlacherm/.local/lib/python3.8/site-packages/qiskit/aqua/__init__.py:86: DeprecationWarning: The package qiskit.aqua is deprecated. It was moved/refactored to qiskit-terra For more information see <https://github.com/Qiskit/qiskit-aqua/blob/main/README.md#migration-guide>
| Qiskit Software | Version |
|---|---|
qiskit-terra | 0.18.1 |
qiskit-aer | 0.8.2 |
qiskit-ignis | 0.6.0 |
qiskit-ibmq-provider | 0.16.0 |
qiskit-aqua | 0.9.4 |
qiskit | 0.29.0 |
qiskit-nature | 0.1.5 |
qiskit-optimization | 0.2.1 |
| System information | |
| Python | 3.8.6 (default, Jan 22 2021, 11:41:28) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)] |
| OS | Linux |
| CPUs | 192 |
| Memory (Gb) | 6046.015735626221 |
| Mon Aug 09 11:43:56 2021 CEST | |